<?php
// Класс объекта-переключателя, передаваемого в branch
class switch_bswitcher
{
	// Разобранный в массив путь, по которому работает текущий branch
	private $parse_url;
	// Смещение относительно начала пути
	private $disp;
	// Смещение относительно disp
	private $subdisp;
	// Ссылка на объект загрузчика
	private $loader = null;
	// Ссылка на объект - генератор url
	private $urlmaker = null;

	function __construct($loader,$urlmaker,$path,$disp,$subdisp=0)
	{
		// Проверяем, передали ли нам готовый путь
		if (!is_a($urlmaker,'switch_urlmaker'))
		{
			//
			print_r($urlmaker);
			mst_error('Не передан urlmaker',
					'Переменная $urlmaker не содержит объект класса switch_urlmaker',1);
		}
		if (empty($path))
		{
			// Путь нам не передали
			// Надо получить путь из параметров запроса
			if ($urlmaker->urltype()=='pathinfo' AND isset($_SERVER["PATH_INFO"]))
			{	// Путь в PATH_INFO
				$path = substr($_SERVER["PATH_INFO"],1);
			}elseif(isset($_GET[($urlmaker->urlvar())]))
			{	// Путь в GET
				$path = $_GET[($urlmaker->urlvar())];
			}else
			{
				// Путь нигде
				$path = array();
			}
			
		}
		// Парсим путь, если этого еще не сделали
		$this->parse_url = switch_util_parsepath($path);
		$this->disp = $disp;
		$this->subdisp = $subdisp;
		$this->loader = $loader;
		$this->urlmaker = $urlmaker;
	}
	function next()
	{
		//
		++$this->subdisp;
		return $this->get($this->subdisp-1);
	}
	function get($subdisp=null)
	{
		//
		return @$this->parse_url[($this->disp +$subdisp)];
	}
	function get_rdisp()
	{
		return $this->disp;
	}
	function get_cdisp()
	{
		return $this->disp + $this->subdisp;
	}
	
	/**
	 * Возвращает номер предыдущего уровня (всегда натуральное число)	
	 * @return void
	 */
	function get_precdisp()
	{
		$r = $this->disp + $this->subdisp - 1;
		if ($r<0)
		{
			return null;
		}else
		{
			return $r;
		}
	}
	function get_parseurl()
	{
		if (mst_is_debug())
		{
			return $this->parse_url;
		}else
		{
			mst_error('Метод недоступен','Метод доступен только при отладке',1);
			return array();
		}
	}
	
	// Основные параметры генерации ссылки
	
	/**
	 * Функция для совместимости с fusebox	
	 * @param $subdisp
	 * @return unknown
	 */
	function cpt_getaction($subdisp)
	{
		//
		--$subdisp;
		return $this->get($subdisp);
	}
	// URL
	function url($path='',$addvars=null)
	{
		return $this->url_branch($path,$addvars);
	}
	function url_branch($path='',$addvars=null)
	{
		// Обрабатываем ссылки на текущую страницу
		$rdisp = $this->get_rdisp();
		$cdisp = $this->get_cdisp();
		// Парсим путь
		$path = switch_util_parsepath($path);
		// Запоминаем в переменную текущий уровень
		// (нужно, чтоб можно было его менять по ключевым словам)

		// Определяем переменные с частами пути
		$path_begin = array();
		$path_middle = array();
		// В первом элементе может быть ключь
		$path_key = @$path[0];
		
		if('THIS'===$path_key)
		{
			// Путь начинается с полного url в текущем бренче 
			// из текущего запроса
			// Вырезаем значащую часть базового URL
			$path_begin = $this->parse_url;
			// Изменяем текущей уровень ссылки на последний в этом URL
			$cdisp = count($this->parse_url);
			// Получаем основную часть пути
			unset($path[0]);
			$path_middle = $path;
			// unset($path_middle[0]);
		}elseif('LEVEL'===$path_key)
		{
			// Путь начинается с URL текущего уровня
			// Вырезаем значащую часть базового URL
			$path_begin = array_slice($this->parse_url,0,$this->get_cdisp());;
			// Получаем основную часть пути
			unset($path[0]);
			$path_middle = $path;
			// unset($path_middle[0]);
		}elseif('PRELEVEL'===$path_key OR 'PREV'===$path_key)
		{
			// Путь начинается с URL предыдущего уровня
			// Вырезаем значащую часть базового URL
			$path_begin = array_slice($this->parse_url,0,$this->get_precdisp());
			// Получаем основную часть пути
			unset($path[0]);
			$path_middle = $path;
		}elseif('PRETHIS'===$path_key)
		{
			// Путь начинается с URL предыдущего уровня
			// Вырезаем значащую часть базового URL
			$parse_url1 = array_filter($this->parse_url, "switch_util_nonull");
			$path_begin = array_slice($parse_url1,0,-1);
			// Получаем основную часть пути
			// Изменяем текущей уровень ссылки на предпоследний в этом URL
			$cdisp = count($this->parse_url);
			// но не меньше нуля
			if ($cdisp>0){--$cdisp;}
			unset($path[0]);
			$path_middle = $path;
		}else
		{	// Никаких ключевых слов нет 
			
			// Вырезаем значащую часть базового URL
			$path_begin = array_slice($this->parse_url,0,$this->get_rdisp());
			// Получаем основную часть пути
			$path_middle = $path;

		}

		// Если пользовательский путь пуст,
		// а запрошен не последний элемент
		// нам понадобится заключительный слешь (так как текущий элемент - папка)
		// print_r($path_begin);
		if (empty($path))
		{
			// Пользовательский путь пуст 
			// проверяем, нужен ли заключающий слешь
			// echo '<br />'.count($this->parse_url).'-'.$this->get_cdisp().'-'.$this->get_rdisp();
			if(count($this->parse_url) > $cdisp)
			{
				//
				$path_begin[] = null;
			}
		}
		// Собираем составные части в один массив
		$path_new = array_merge($path_begin, $path_middle);
		// echo '<br>---<br>';
		// print_r($path_begin);
		// print_r($path_middle);
		// print_r($path_new);
		// Превращаем массив в URL
		return $this->urlmaker->url($path_new,$addvars);
	}
	// Путь внутри текущего branch
	function path_branch($path)
	{
		// Возвращает относительный путь внутри branch
		// Если $path начинается со слеша - путь относительно корня branch
		// Иначе - относительно папки, в которой расположен текущий файл
		// echo "pre-{$path}<br />";
		if ('/'==$path[0])
		{
			// Путь, относительно корня текущего branch
			$path = 'switch/'.$this->loader->get_branchname().'/'
						.substr($path,1);
		}else
		{
			// Путь относительно текущей папки
			$this_path = mst_modpath_parsethis(1);
			$path = $this_path['dir'].$path;
		}
		// echo "<pre>post-{$path}\n"; print_r($this_path); echo '</pre>';
		return mst_modpath($this->loader->get_branchmod(),$path);
	}	
	// Функции управления шаблонами
	function tml_add($runer,$mod,$file,$vars=null,$reset=false,$recurse=false)
	{
		if ($reset)
		{
			return $this->tml_reset($runer,$mod,$file,$vars,$recurse);
		}else
		{
			return $this->loader->tml_add($runer,$mod,$file,$vars);
		}
	}
	function tml_reset($runer,$mod,$file,$vars=null,$recurse=false)
	{
		return $this->loader->tml_reset($runer,$mod,$file,$vars,$recurse);
	}
	function tml_off($recurse=false,$forbid=false)
	{
		return $this->loader->tml_off($recurse,$forbid);
	}
	function tml_redirect($msturl)
	{
		return $this->loader->tml_redirect($msturl);
	}
	function tml_mime($content_type,$tml_off=false,$download_file=null)
	{
		return $this->loader->tml_mime($content_type,$tml_off,$download_file);
	}
	function tml_setvar($varname,$value,$template_id=null)
	{
		return $this->loader->tml_setvar($varname,$value,$template_id);
	}
	/**
	 * Исполнить вложенный branch	
	 * @param $branch_MT_mod_name - имя модуля, которому принадлежит branch
	 * @param $branch - имя branch
	 * @param $file - запускаемый файл в branch
	 * @param $disp - смещение относительно начала пути
	 * @param $urlvar - имя переменной со ссылкой
	 * @param $branch_path - принудительно заданный путь
	 * @param $MT_mod_cust - параметры, передаваемые в branch
	 * @param $return_text - вернуть контент в виде текста
	 * @return mix
	 */
	function subswitch($branch_MT_mod_name,$branch,$file,$disp,
						$urlvar=null,$branch_path=null,$MT_mod_cust=NULL,
						$return_text=false)
	{
		
		
		if (is_null($branch_path)
			AND is_null($urlvar))
		{
			// Мы остаемся в рамках текущего пути
			// Распарсенный путь можем скопировать из текущего модуля
			$branch_path = $this->parse_url;
			// А генератор URL - клонировать
			$urlmaker = clone $this->urlmaker;
			// Вычисляем смещение
			if ('this'===$disp)
			{
				// Текущее смещение
				$disp = $this->subdisp + $this->disp;
			}else
			{
				// Смещение относительно начала текущего branch
				$disp = $disp + $this->disp;
			}
		}elseif(!is_null($branch_path))
		{
			// Мы переходим в "виртуальный" путь
			// Создаем обработчика URL
			$urlmaker = $this->urlmaker->suburlmaker(null,$this->parse_url);
		}elseif(!is_null($urlvar))
		{
			// Мы переходим в путь из другой переменной GET
			$urlmaker = $this->urlmaker->suburlmaker(
								$urlvar,$this->parse_url);
		}
		return $this->loader->subswitch($branch_MT_mod_name,$branch,$file,$disp,
						$urlmaker,$branch_path,$MT_mod_cust,$return_text);
	}
}


?>